package com.lz.gamll.feign.interceptor;

import com.lz.gmall.cart.vo.UserAuthInfoVo;
import com.lz.gmall.common.utils.UserAuthUtil;
import feign.RequestInterceptor;
import feign.RequestTemplate;
import org.springframework.stereotype.Component;

//feign远程调用拦截器，远程调用之前先经过拦截器
public class FeignRequestInterceptor implements RequestInterceptor {

    /**
     * FeignRequestInterceptor这个类中如何获取到CartController的addCart方法中的userId和userTempId？
     *
     * Gateway在进行userId和userTempId透传的时候是把数据存储到了请求头中，整个远程调用使用的是-一个线程
     * 要从请求头中获取数据，先获取Request对象，然后从Request对象中获取请求头数据。
     *
     * 要在FeignRequestInterceptor拦截器中获取Request对象，是无法直接获取的。但是CartController中的addCart 方法是可以获取到Request的对象的
     * 因此需要需要将addCart方法中的request对象传递到FeignRequestInterceptor
     *
     * 怎么传递?由于整个远程调用使用的是一.个线程，因此在进行传递的时候可以在一个线程内去进行request对象传递-----> ThreadLocal
     * @param template 远程调用模板
     */
    @Override
    public void apply(RequestTemplate template) {
        //采用springMVC提供的工具类
        //获取访问该方法的请求
//        ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes)RequestContextHolder.getRequestAttributes();
//        if (servletRequestAttributes!=null){
//            HttpServletRequest request = servletRequestAttributes.getRequest();
//            template.header("userId",request.getHeader("userId"));
//            template.header("userTempId",request.getHeader("userTempId"));
//        }

        UserAuthInfoVo userAuthInfo = UserAuthUtil.getUserAuthInfo();
        template.header("userId",userAuthInfo.getUserId());
        template.header("userTempId",userAuthInfo.getUserTempId());
    }
}
